
#ifndef _DOUBLE_LINKEDLIST_H_
#define _DOUBLE_LINKEDLIST_H_

// 以下是头文件的内容, 主要包括类型(type), 位置(position)， 函数的原型定义在.h头文件中

#define Status int
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int ElemType;

typedef struct Node {
    ElemType data;  // 数据域
    struct Node *prev;  // 指针域1, 指向前驱
    struct Node *next;  // 指针与2, 指向后继
} Node, *DoubleLinkedList;

// 双向链表的初始化
Status InitList(DoubleLinkedList *list);

// 双向链表是否为空
int ListIsEmpty(DoubleLinkedList list);

// 销毁链表
Status DestroyList(DoubleLinkedList *list);

// 获取链表长度
unsigned int ListLength(DoubleLinkedList list);

// 获取指定位置的元素,  index可取范围是 1 - 链表的长度
Status GetElem(DoubleLinkedList list, int index, ElemType *e);

/**
 * 在指定的位置添加元素
 * 注意: index的取值范围是 1至链表长度加一
 * 要想在指定位置插入元素, 可以先找到当前位置的前驱元素
 */
Status InsertElem(DoubleLinkedList list, int index, ElemType e);

/**
 * 删除指定位置的数据
 */
Status DeleteElem(DoubleLinkedList list, int index, ElemType *e);

#endif